package com.xiongwei.collection;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * Iterator是一种抽象的数据访问模型
 * 使用Iterator进行迭代的好处:
 *      1.对任何集合都采用同一种访问模型
 *      2.调用者不需知道集合内部集合
 *      3.集合类返回的Iterator对象知道如何迭代
 *
 * Java提供了标准的迭代器模型,即集合类实现java.util.Iterable接口,返回java.util.Iterator实例
 *
 * @author XiongWei
 * @date 2021/1/7
 */
public class IteratorUse {

    public static void main(String[] args) {
        ReverseList<String> rList = new ReverseList<>();
        rList.add("apple");
        rList.add("orange");
        rList.add("pear");
        for (String s : rList) {
            System.out.println(s);
        }
    }
}

class ReverseList<T> implements Iterable<T> {

    private List<T> list = new ArrayList<>();

    public void add(T t) {
        list.add(t);
    }

    @Override
    public Iterator<T> iterator() {
        return new ReverseIterator(list.size());
    }

    class ReverseIterator implements Iterator<T> {

        int index;

        public ReverseIterator(int index) {
            this.index = index;
        }

        @Override
        public boolean hasNext() {
            return this.index > 0;
        }

        @Override
        public T next() {
            index--;
            return ReverseList.this.list.get(index);
        }
    }
}
